import os
import trace
import traceback

from crewai import Agent, Task, Crew, Process, LLM
from crewai_tools import SerperDevTool, WebsiteSearchTool
from langchain_openai import ChatOpenAI
from langchain_community.llms import Ollama
import streamlit as st
import time

# 设置API密钥（在实际应用中，请使用环境变量）
os.environ["OPENAI_API_KEY"] = "your-openai-api-key"
os.environ["SERPER_API_KEY"] = "your-serper-api-key"

llm = LLM(
        model='doubao-1-5-pro-32k-character-250715',
        base_url='http://192.168.77.47:8099/api/v1/doubao',
        api_key='2e6d307b-3067-4639-ae78-ee7e55fc2800'
    )
class CrewAIChatbot:
    def __init__(self, use_local_llm=True):
        """
        初始化聊天机器人

        Args:
            use_local_llm (bool): 是否使用本地LLM（如Ollama）
        """
        self.use_local_llm = use_local_llm
        self.setup_llm()
        self.setup_tools()
        self.setup_agents()
        self.setup_crew()
        self.conversation_history = []


    def setup_llm(self):
        """设置LLM模型"""
        if self.use_local_llm:
            # 使用本地Ollama模型
            self.llm = LLM(
        model='doubao-1-5-pro-32k-character-250715',
        base_url='http://192.168.77.47:8099/api/v1/doubao',
        api_key='2e6d307b-3067-4639-ae78-ee7e55fc2800'
    )
        else:
            # 使用OpenAI模型
            self.llm = ChatOpenAI(
                model="gpt-4",
                temperature=0.7
            )


    def setup_tools(self):
        """设置工具"""
        self.search_tool = SerperDevTool()
        self.web_search_tool = WebsiteSearchTool()

    def setup_agents(self):
        """设置各种专业代理"""

        # 对话理解代理 - 负责分析用户意图和上下文
        self.conversation_analyst = Agent(
            role="对话分析师",
            goal="分析用户消息的意图、情感和上下文，提取关键信息",
            backstory="你是一个专业的对话分析师，擅长理解自然语言，能够准确识别用户的真实需求和情感状态。",
            tools=[],
            llm=self.llm,
            verbose=True
        )

    def setup_crew(self):
        """设置工作流程"""
        collect_task = Task(
            description="处理用户积分计算请求：大专毕业三年",
            expected_output="详细的积分计算结果，包括得分、计算依据和可能的建议"
        )
        self.crew = Crew(
            agents=[
                self.conversation_analyst
            ],
            verbose=True
        )

    def analyze_user_intent(self, user_message):
        """分析用户意图"""
        analysis_task = Task(
            description=f"""
            分析以下用户消息：
            "{user_message}"

            请分析：
            1. 用户的主要意图是什么？
            2. 用户的情感状态如何？
            3. 需要什么类型的信息或帮助？

            请提供简洁的分析结果。
            """,
            agent=self.conversation_analyst,
            expected_output="用户意图分析报告"
        )

        return analysis_task

    def search_information(self, user_message, intent_analysis):
        """搜索相关信息"""
        search_task = Task(
            description=f"""
            基于以下用户问题和意图分析，搜索相关信息：

            用户问题: {user_message}
            意图分析: {intent_analysis}

            请搜索并提供准确、相关的信息来帮助回答用户问题。
            如果不需要外部信息，请说明原因。
            """,
            agent=self.research_agent,
            expected_output="相关信息搜索结果"
        )

        return search_task

    def generate_response(self, user_message, intent_analysis, search_results):
        """生成最终回复"""
        response_task = Task(
            description=f"""
            基于以下信息生成友好、有用的回复：

            用户问题: {user_message}
            意图分析: {intent_analysis}
            搜索结果: {search_results}

            请生成一个自然、有帮助的回复，要考虑到对话的上下文和用户的情感状态。
            如果搜索到了相关信息，请整合到回复中。
            """,
            agent=self.response_generator,
            expected_output="给用户的友好回复"
        )

        return response_task

    def process_message(self, user_message):
        """处理用户消息"""
        try:
            # 记录对话历史
            self.conversation_history.append({"role": "user", "content": user_message})



            # 执行工作流
            result = self.crew.kickoff(inputs={"input":user_message})

            # 获取最终回复
            final_response = str(result)

            # 记录回复
            self.conversation_history.append({"role": "assistant", "content": final_response})

            return final_response

        except Exception as e:
            traceback.print_exc()
            error_msg = f"抱歉，处理消息时出现错误：{str(e)}"
            self.conversation_history.append({"role": "assistant", "content": error_msg})
            return error_msg

    def get_conversation_history(self):
        """获取对话历史"""
        return self.conversation_history


# Streamlit Web界面
def main():
    st.set_page_config(
        page_title="CrewAI聊天机器人",
        page_icon="🤖",
        layout="wide"
    )

    st.title("🤖 CrewAI智能聊天机器人")
    st.markdown("基于CrewAI框架构建的多代理智能对话系统")

    # 侧边栏配置
    with st.sidebar:
        st.header("配置选项")
        use_local_llm = st.checkbox("使用本地LLM (Ollama)", value=False)
        clear_history = st.button("清空对话历史")

        st.markdown("---")
        st.subheader("关于")
        st.markdown("""
        这个聊天机器人使用CrewAI框架构建，包含多个专业代理：
        - 🧠 对话分析师 - 理解用户意图
        - 🔍 信息研究员 - 搜索相关信息  
        - 💬 对话专家 - 生成友好回复
        - ⚙️ 技术顾问 - 提供专业建议
        """)

    # 初始化聊天机器人
    if 'chatbot' not in st.session_state or clear_history:
        st.session_state.chatbot = CrewAIChatbot(use_local_llm=use_local_llm)
        st.session_state.messages = []

    # 显示对话历史
    for message in st.session_state.messages:
        with st.chat_message(message["role"]):
            st.markdown(message["content"])

    # 用户输入
    if prompt := st.chat_input("请输入您的问题..."):
        # 添加用户消息
        st.session_state.messages.append({"role": "user", "content": prompt})
        with st.chat_message("user"):
            st.markdown(prompt)

        # 生成回复
        with st.chat_message("assistant"):
            with st.spinner("思考中..."):
                response = st.session_state.chatbot.process_message(prompt)
                st.markdown(response)

        st.session_state.messages.append({"role": "assistant", "content": response})


# 命令行界面版本
def command_line_interface():
    """命令行界面版本"""
    print("🤖 CrewAI聊天机器人 - 命令行版本")
    print("输入 'quit' 或 'exit' 退出程序")
    print("-" * 50)

    chatbot = CrewAIChatbot()

    while True:
        user_input = input("\n👤 您: ").strip()

        if user_input.lower() in ['quit', 'exit', '退出']:
            print("🤖 再见！期待再次为您服务。")
            break

        if not user_input:
            continue

        print("🤖 思考中...")
        response = chatbot.process_message(user_input)
        print(f"🤖 机器人: {response}")


if __name__ == "__main__":
    # 可以选择运行Web界面或命令行界面
    import sys

    if len(sys.argv) > 1 and sys.argv[1] == "web":
        main()
    else:
        command_line_interface()